package JavaEE.NetWork.UDP;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

// 创建客户端
// UDP 是无连接的，每次通信需独立指定目标地址(IP + Port)
public class EchoClient {
    private DatagramSocket socket = null;
    // 目标服务器的ip
    private String serverip;
    // 目标服务器的端口号
    private int serverPort;
    // (与服务器不同的是,创建客户端,需要准确的知道"目标ip"和"目标端口号")
    // (因为服务器返回响应,是直接返回给"发送请求的一方",而客户端发送请求,必须明确目的id和端口号)
    public EchoClient(String ip,int Port) throws SocketException {
        this.serverip = ip;
        this.serverPort = Port;
        // 客户端定义数据报时,通常"随机链接一个未被使用的端口"
        // 防止出现"端口被占用"的情况.
        socket = new DatagramSocket();
    }
    public void start() throws IOException {
        Scanner in = new Scanner(System.in);
        System.out.println("客户端启动!");
        while(true){
            // 1. 读取客户端输入的内容
            System.out.print("> ");
            String request = in.next();
            // 2. 将内容构造成 UDP请求 发送给服务器
            // (注意还要填入"服务器ip"和"服务器端口号")
            DatagramPacket reqPacket = new DatagramPacket(request.getBytes(),
                    request.getBytes().length, InetAddress.getByName(serverip),serverPort);
            // 发送请求
            socket.send(reqPacket);
            // 3. 接收服务器的响应
            DatagramPacket resPacket = new DatagramPacket(new byte[4096],4096);
            // 阻塞等待服务器响应,直到收到数据或超时(UDP 不保证可靠传输，可能丢包)
            socket.receive(resPacket);
            // 4. 把响应显示到控制台
            String response = new String(resPacket.getData(),0,resPacket.getLength());
            System.out.println(response);
        }
    }

    public static void main(String[] args) throws IOException{
        // "127.0.0.1"为"环回IP",无论主机真实ip是啥,都可以用环回ip来访问.
        EchoClient client = new EchoClient("127.0.0.1",9090);
        client.start();
    }
}









